#ifndef SPI_H
#define SPI_H

#include <stm32f4xx.h>
#include "sys.h"

#define W25Q128_SS		PBout(14)
#define W25Q128_SCLK   	PBout(3)
#define W25Q128_MOSI   	PBout(5)
#define W25Q128_MISO	PBin(4)

#define sFLASH_DUMMY_BYTE         0xA5


/**
 @brief 初始化w25q128闪存,使用硬件初始化
*/
void w25q128_init(void);


/**
 @brief 使用引脚模拟硬件闪存初始化
 @note 使用的原因是,由于有些硬件没有SPI,只能由引脚模拟
*/
void w25q128_simulate_init(void);


/**
 @brief 向SPI1发送字节
 @param byte: 要发送的字节
*/
uint8_t SPI1_SendByte(uint8_t byte);


/**
 @brief 使用引脚模拟,向SPI1发送字节,与w25q128_simulate_init一起用
 @param byte: 要发送的字节
*/
uint8_t SPI1_Simulate_SendByte(uint8_t byte);


/**
 @brief 读取厂商和设备id
 @param m_id: 厂商id (m_id=EF)
 @param d_id: 设备id (d_id=17)
*/
void w25q128_read_id(uint8_t *m_id,uint8_t *d_id);


/**
 @brief 读取厂商和设备id
 @param m_id: 厂商id (m_id=EF)
 @param d_id: 设备id (d_id=17)
*/
void w25q128_simulate_read_id(uint8_t *m_id,uint8_t *d_id);


/**
  * @brief  Reads a byte from the SPI Flash.
  * @note   This function must be used only if the Start_Read_Sequence function
  *         has been previously called.
  * @param  addr: 地址
  * @retval Byte Read from the SPI Flash.
  */
uint8_t w25q128_read_byte(uint32_t addr);


/**
  * @brief  Reads a byte from the SPI Flash.
  * @note   This function must be used only if the Start_Read_Sequence function
  *         has been previously called.
  * @param  addr: 地址
  * @retval Byte Read from the SPI Flash.
  */
uint8_t w25q128_simulate_read_byte(uint32_t addr);


/**
 @brief 从指定地址读取指定长度字节
 @param addr: 地址
 @param buf: 用于保存数据
 @param len: 读取的长度
*/
void w25q128_read_buf(uint32_t addr, uint8_t *buf, uint32_t len);


/**
 @brief 从指定地址读取指定长度字节
 @param addr: 地址
 @param buf: 用于保存数据
 @param len: 读取的长度
*/
void w25q128_simulate_read_buf(uint32_t addr, uint8_t *buf, uint32_t len);


#endif  // SPI_H
